<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 vector-feature-night-mode-enabled skin-theme-clientpref-os vector-sticky-header-enabled" lang="fr" dir="ltr"><head>
<meta charset="UTF-8">
<title>Pipelining HTTP</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="./_res_/favicon.png">
<link rel="canonical" href="https://fr.wikipedia.org/wiki/Pipelining_HTTP"> <link href="./_mw_/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
<link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
<link rel="stylesheet" type="text/css" href="./_res_/footer.css">
<link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Pipelining_HTTP rootpage-Pipelining_HTTP skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">Pipelining HTTP</span></h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="contentSub">
<div id="mw-content-subtitle"></div>
</div>
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="fr" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="fr" dir="ltr">
<p>Le <b>pipelining HTTP</b> est une technique consistant à combiner plusieurs requêtes <a href="Hypertext_Transfer_Protocol" title="Hypertext Transfer Protocol">HTTP</a> dans une seule connexion <a href="Transmission_Control_Protocol" title="Transmission Control Protocol">TCP</a> sans attendre les réponses correspondant à chaque requête.
</p><p>Le pipelining présente plusieurs avantages :
</p>
<ul><li>amélioration importante du temps de chargement des pages, en particulier sur des liaisons présentant une forte <a href="Latence_(informatique)" title="Latence (informatique)">latence</a> ;</li>
<li>réduction de la charge pour l'infrastructure réseau ainsi que pour les serveurs et clients HTTP.</li></ul>
<p>Le pipelining nécessite, de la part du client aussi bien que du serveur, le support de la norme HTTP 1.1 telle que décrite dans la <a href="RFC" class="mw-redirect" title="RFC">RFC</a> 2616.
</p>
<div class="mw-heading mw-heading2"><h2 id="Principe">Principe</h2></div>
<p>Dans la version 1.0 du <a href="Hypertext_Transfer_Protocol" title="Hypertext Transfer Protocol">protocole HTTP</a>, le traitement des requêtes est séquentiel. Le client doit effectuer une nouvelle connexion TCP avec le serveur pour chaque objet (page, image, etc.) demandé et attendre le résultat avant de pouvoir poursuivre avec la requête suivante.
</p><p>La technique du pipelining contourne ce problème en exploitant le principe de <a href="Keepalive" title="Keepalive">connexion persistante</a> (keepalive). Lorsque le client envoie une requête HTTP au serveur, celui-ci inclut dans sa réponse la version du protocole HTTP utilisée. Si les deux extrémités utilisent HTTP 1.1, la connexion sera par défaut persistante. Le client doit indiquer qu'il souhaite fermer la connexion persistante avec le message "Connection: close" lorsqu'il ne souhaite plus utiliser la connexion.
</p><p>Le pipelining peut alors prendre place sans autre négociation. Il consiste à envoyer plusieurs requêtes à la suite sans attendre leurs résultats. Le serveur HTTP a l'obligation de renvoyer les réponses exactement dans le même ordre que les requêtes.
</p><p>On remarquera que puisqu'il est nécessaire qu'il y ait un échange complet entre client et serveur pour s'assurer qu'ils supportent bien tous les deux HTTP 1.1, les requêtes constituant une nouvelle connexion ne peuvent pas être l'objet du pipelining. De même, seules les requêtes idempotentes<sup id="cite_ref-1" class="reference"><a href="#cite_note-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup> — telles que GET, HEAD, PUT et DELETE — peuvent faire l'objet du pipelining.
</p>
<div class="mw-heading mw-heading2"><h2 id="Avantages">Avantages</h2></div>
<p>L'utilisation du pipelining hérite plusieurs avantages de l'utilisation des connexions persistantes. Ces avantages sont résumés dans la section 8.1.1 de la <a href="https://datatracker.ietf.org/doc/html/rfc2616" class="extiw external" title="rfc:2616">RFC 2616</a> décrivant le protocole HTTP 1.1. Notamment :
</p>
<ul><li>En ouvrant et fermant moins de connexions TCP, routeurs et hôtes (client, serveur, <a href="Serveur_mandataire" class="mw-redirect" title="Serveur mandataire">serveur mandataire</a>, etc.) économisent du temps CPU. Les hôtes en particulier économisent la mémoire utilisée pour les blocs de contrôle TCP ;</li>
<li>La <a href="Congestion_(r%C3%A9seau)" title="Congestion (réseau)">congestion</a> du réseau est diminuée par la réduction du nombre de <a href="Paquet_(r%C3%A9seau)" title="Paquet (réseau)">paquets</a> dus à l'ouverture de la connexion TCP, et par le fait qu'on laisse suffisamment de temps à TCP pour déterminer l'état de congestion du réseau ;</li>
<li>La latence est réduite pour les requêtes suivantes puisqu'on ne perd pas de temps à cause de l'initialisation de la connexion TCP. De plus, en début de connexion, l'algorithme Slow Start implique un débit plus réduit que pour une connexion établie.</li></ul>
<p>L'avantage supplémentaire à l'utilisation du pipelining est qu'un client peut effectuer plusieurs requêtes sans attendre chaque réponse, permettant à une seule connexion TCP d'être utilisée avec plus d'efficacité, dans un temps plus court. Le concept est similaire aux mécanismes de <a href="Fen%C3%AAtre_glissante" title="Fenêtre glissante">fenêtre glissante</a> dans <a href="Transmission_Control_Protocol" title="Transmission Control Protocol">TCP</a> ou fenêtre d'anticipation dans <a href="High-Level_Data_Link_Control" title="High-Level Data Link Control">HDLC</a>.
</p>
<div class="mw-heading mw-heading2"><h2 id="Problèmes"><span id="Probl.C3.A8mes"></span>Problèmes</h2></div>
<p>Le <a href="World_Wide_Web_Consortium" title="World Wide Web Consortium">W3C</a> a conduit en 1997 une étude sur les performances obtenues grâce aux nouveaux standards de l'époque qu'étaient HTTP 1.1, CSS1 et PNG. L'application construite à l'occasion de ces tests utilisait le pipelining. Les résultats ont montré que HTTP 1.1 avec connexions persistantes et pipelining réduisait d'un facteur 6 le nombre de paquets envoyés mais introduisait une latence supplémentaire d'un facteur 1,5 à la grande surprise des auteurs. HTTP 1.1 est dans tous les cas plus rapide avec pipelining que sans.
</p><p>Les auteurs de l'étude ont conclu à une possible interférence entre le pipelining et l'<a href="Algorithme_de_Nagle" title="Algorithme de Nagle">algorithme de Nagle</a> mis en œuvre par TCP. Celui-ci effectue en effet, au niveau 4 du <a href="Mod%C3%A8le_OSI" title="Modèle OSI">modèle OSI</a>, le même type de mise en tampon des données que le pipelining au niveau 7. Cette succession de mise en tampon introduit un délai supplémentaire à l'envoi des données. C'est pourquoi il est recommandé pour les clients et les serveurs utilisant HTTP 1.1 avec pipelining de désactiver purement et simplement l'algorithme de Nagle, ce qui est habituellement possible dans l'interface <a href="Berkeley_sockets" title="Berkeley sockets">BSD socket</a> via l'option TCP_NODELAY.
</p><p>Ce problème avait également été identifié en 1997 par John Heidemann dans une étude portant sur les connexions persistantes dans HTTP. Il l'avait alors appelé « <i><span class="lang-en" lang="en">Short-Signal-Segment Problem</span></i> ». Plusieurs autres problèmes provenant d'interaction entre TCP et HTTP 1.1 sont abordés dans son étude mais concernent les connexions persistantes et pas seulement le pipelining.
</p><p>Par ailleurs, le pipelining perd son intérêt lorsqu'une requête est bloquante et nécessite d'attendre son résultat pour pouvoir procéder à l'envoi de requêtes HTTP subséquentes. En cas d'échec on doit alors retenter la requête. Aucune ressource n'est donc économisée au niveau de TCP. Un tel cas de figure se produit par exemple lorsqu'un client reçoit des réponses 401 ou 407 ou même des redirections 3xx (voir <a href="Liste_des_codes_HTTP" title="Liste des codes HTTP">Liste des codes HTTP</a>) en réponse à une <a href="HTTP_Authentification" class="mw-redirect" title="HTTP Authentification">HTTP Authentification</a>.
</p>
<div class="mw-heading mw-heading3"><h3 id="Pipelining_et_serveurs_mandataires">Pipelining et serveurs mandataires</h3></div>
<p>La <a href="https://datatracker.ietf.org/doc/html/rfc2616" class="extiw external" title="rfc:2616">RFC 2616</a> indique que lorsqu'une connexion fait l'objet de pipelining, les réponses doivent être envoyées dans le même ordre que les requêtes. Lorsqu'un serveur mandataire se trouve entre le serveur et le client, il doit donc en faire autant. Or un client peut accéder à plusieurs serveurs simultanément à travers le serveur mandataire, imposant à celui-ci de conserver en mémoire l'ordre des requêtes pour chaque paire client/serveur.
</p><p>Cette opération s'avère rapidement complexe lorsqu'on augmente le nombre de clients et implique de temporiser les réponses pour pallier les problèmes de déséquencement qui peuvent apparaître dans un réseau TCP/IP<sup id="cite_ref-2" class="reference"><a href="#cite_note-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup>. Les difficultés augmentent encore lorsqu'on tente de profiter du serveur mandataire pour répartir la charge sur plusieurs serveurs web.
</p>
<div class="mw-heading mw-heading2"><h2 id="Implémentations"><span id="Impl.C3.A9mentations"></span>Implémentations</h2></div>
<p>La norme HTTP 1.1 impose de supporter le pipelining sans pour autant rendre son usage obligatoire. Ce sont les clients qui prennent la décision d'utiliser le pipelining si le serveur le supporte.
</p>
<ul><li>Clients :
<ul><li><a href="Google_Chrome" title="Google Chrome">Google Chrome</a> supporte le pipelining de manière expérimentale (donc désactivé par défaut).</li>
<li><a href="Mozilla_Firefox" title="Mozilla Firefox">Mozilla Firefox</a> 2.0 et 3.0 supportent le pipelining mais le désactivent par défaut<sup id="cite_ref-3" class="reference"><a href="#cite_note-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup>.</li>
<li><a href="Opera" title="Opera">Opera</a> supporte le pipelining depuis la version 4.0 et l'active par défaut<sup id="cite_ref-4" class="reference"><a href="#cite_note-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup>.</li>
<li><a href="Internet_Explorer_8" title="Internet Explorer 8">Internet Explorer 8</a> ne supporte pas le pipelining.</li></ul></li></ul>
<ul><li>Serveurs :
<ul><li><a href="Apache_HTTP_Server" title="Apache HTTP Server">Apache</a> supporte le pipelining depuis (au moins) la version 1.3.</li>
<li><a href="Internet_Information_Services" title="Internet Information Services">IIS</a> supporte le pipelining depuis la version 4.0<sup id="cite_ref-5" class="reference"><a href="#cite_note-5"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup>. Ce support étant défectueux, il a été supprimé dans les versions suivantes<sup class="need_ref_tag" style="padding-left:2px;"><span title="Ce passage nécessite une référence ; voir l'aide.">[réf. nécessaire]</span></sup>.</li></ul></li></ul>
<ul><li>Serveurs mandataires</li></ul>
<p>La plupart des serveurs mandataires sont capables de servir un client qui fait du pipelining. Cependant, ils ne sont pas capables d'envoyer des requêtes pipelinées vers le serveur en amont.
</p><p>La seule exception connue est <a rel="nofollow" class="external text" href="http://www.pps.jussieu.fr/~jch/software/polipo/">Polipo</a>, qui utilise le pipelining de façon agressive. Voir <a rel="nofollow" class="external text" href="http://www.pps.jussieu.fr/~jch/software/polipo/manual/Pipelining.html">The Polipo Manual: 1.4.2 Pipelining</a>.
</p>
<div class="mw-heading mw-heading2"><h2 id="Références"><span id="R.C3.A9f.C3.A9rences"></span>Références</h2></div>
<ul><li><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> <a href="https://datatracker.ietf.org/doc/html/rfc2616" class="extiw external" title="rfc:2616">RFC 2616</a> définissant HTTP/1.1 (<a rel="nofollow" class="external text" href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html#sec8.1.2.2">lien direct vers le pipelining</a>)</li>
<li><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> <a rel="nofollow" class="external text" href="http://www.isi.edu/lsam/publications/phttp_tcp_interactions/">Performance Interactions Between P-HTTP and TCP Implementations</a> (Interactions entre connexions HTTP persistantes et TCP)</li>
<li><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> <a rel="nofollow" class="external text" href="http://www.w3.org/Protocols/HTTP/Performance/Pipeline.html">Network Performance Effects of HTTP/1.1, CSS1, and PNG</a> (étude de l'impact de HTTP/1.1 sur les performances réseaux)</li>
<li><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> <a rel="nofollow" class="external text" href="https://www.mozilla.org/projects/netlib/http/pipelining-faq.html">HTTP/1.1 Pipelining FAQ</a></li>
<li><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> <a rel="nofollow" class="external text" href="http://public.research.att.com/~bala/papers/h0vh1.html">Key differences between HTTP/1.0 and HTTP/1.1</a></li>
<li><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> <a rel="nofollow" class="external text" href="http://www.die.net/musings/page_load_time/">"Optimizing Page Load Times" article</a> (Optimiser le temps de chargement d'une page)</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Notes">Notes</h2></div>
<div class="mw-references-wrap"><ol class="references">
<li id="cite_note-1"><span class="mw-cite-backlink"><a href="#cite_ref-1">↑</a> </span><span class="reference-text"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> Voir <a href="https://datatracker.ietf.org/doc/html/rfc2616" class="extiw external" title="rfc:2616">RFC 2616</a>, section 9.1.2, <a rel="nofollow" class="external text" href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.1.2">Idempotent Methods</a></span>
</li>
<li id="cite_note-2"><span class="mw-cite-backlink"><a href="#cite_ref-2">↑</a> </span><span class="reference-text"><abbr class="abbr indicateur-langue" title="Langue : français">(fr)</abbr> <a rel="nofollow" class="external text" href="http://www.run.montefiore.ulg.ac.be/~martin/resources/pipelining/pipelining-tutorial.html">Gestion d'une connexion HTTP avec pipelining dans un proxy</a></span>
</li>
<li id="cite_note-3"><span class="mw-cite-backlink"><a href="#cite_ref-3">↑</a> </span><span class="reference-text"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> Voir Firefox Help: Tips & Tricks, <a rel="nofollow" class="external text" href="https://www.mozilla.org/support/firefox/tips#oth_pipelining">Enable pipelining</a>.</span>
</li>
<li id="cite_note-4"><span class="mw-cite-backlink"><a href="#cite_ref-4">↑</a> </span><span class="reference-text"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> Voir <a rel="nofollow" class="external text" href="http://www.opera.com/pressreleases/en/2000/03/20000328.dml">Opera 4.0 Upgrades File Exchange: Includes HTTP 1.1</a>.</span>
</li>
<li id="cite_note-5"><span class="mw-cite-backlink"><a href="#cite_ref-5">↑</a> </span><span class="reference-text"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> Voir Microsoft Internet Information Server Ressource Kit, <a rel="nofollow" class="external text" href="http://www.microsoft.com/technet/archive/iis4/reskit/iis40rg/iisrkc01.mspx?mfr=true">Chapter 1</a>.</span>
</li>
</ol></div>
<ul id="bandeau-portail" class="bandeau-portail"><li><span class="bandeau-portail-element"><span class="bandeau-portail-icone"><span class="noviewer" typeof="mw:File"></span></span> <span class="bandeau-portail-texte">Portail de l’informatique</span> </span></li> </ul></div><!--htdig_noindex--><div><div class="zim-footer">
Cet article est issu de <a class="external text" title="Dernière modification le 2021-11-23" href="https://fr.wikipedia.org/wiki/?title=Pipelining_HTTP&oldid=188235342">Wikipédia</a>. Sauf mention contraire, le texte est disponible sous <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.fr">Creative Commons Attribution-Share Alike 4.0</a>. Des conditions supplémentaires peuvent s’appliquer aux fichiers multimédias.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
<script src="./_webp_/webpHandler.js"></script>
</body></html>